package cn.tm.ms.nerver.strategy;

import cn.tm.ms.nerver.strategy.entry.StrategyDo;

/**
 * <b style="color:red;font-size:20px">容错策略</b>
 * <p>
 * 1.故障转移(Failover)<p>
 * 失败自动切换，当出现失败，重试其它服务器<p>
 * 通常用于读操作，但重试会带来更长延迟<p>
 * <p>
 * 2.快速失败(Failfast)<p>
 * 快速失败，只发起一次调用，失败立即报错<p>
 * 通常用于非幂等性的写操作，比如新增记录<p>
 * <p>
 * 3.故障保护(Failsafe)<p>
 * 失败安全，出现异常时，直接忽略<p>
 * 通常用于写入审计日志等操作<p>
 * <p>
 * 4.失败缓存(Failcache)<p>
 * <p>
 * 5.失败恢复(Failback)<p>
 * 失败自动恢复，后台记录失败请求，定时重发<p>
 * 通常用于消息通知操作<p>
 * <p>
 * 6.并行策略(Forking)<p>
 * 并行调用多个服务器，只要一个成功即返回<p>
 * 通常用于实时性要求较高的读操作，但需要浪费更多服务资源<p>
 * 可通过forks="2"来设置最大并行数<p>
 * <p>
 * 7.广播策略(Broadcast)<p>
 * 广播调用所有提供者，逐个调用，任意一台报错则报错<p>
 * 通常用于通知所有提供者更新缓存或日志等本地资源信息<p>
 * @author lry
 * @param <REQ>
 * @param <RES>
 */
public interface IStrategy<REQ, RES> {

	/**
	 * 容错执行
	 * 
	 * @param ftDo
	 * @return
	 */
	RES execute(StrategyDo<REQ, RES> ftDo);
	
}
